Lab 3 - Behavioural VHDL

 

Цел

 

Придобиване на практически опит за разработване на поведенчески VHDL модели.

 

Задание

Да се разработят поведенчески VHDL модели на различни цифрови схеми. Да се провери корекността на моделите посредством симулация.

 

Задача 1 -- Брояч, 4bit, реверсивен, асинхронен reset (оператор if-then-else)

Да се разработи поведенчески VHDL модел на 4-битов брояч. Описанието на изводите на брояча е дадено в Таблица 1.

Таблица 1.
Сигнал Тип Посока Функция
UD STD_LOGIC вход посока на броене; 1 - събиране, 0 - изваждане
CIN STD_LOGIC вход входен пренос/заем; 1 - разрешава броенето, 0 - забранява броенето
RESET STD_LOGIC вход асинхронно нулиране
CLOCK STD_LOGIC вход тактов вход; активен нарастващ фронт
Q UNSIGNED(3 downto 0) изход състояние на брояча
COUT STD_LOGIC изход изходен пренос/заем

На фигура 1 е даден модела на 4-битов брояч (cnt4.vhd). Съответната тестова установка е записана във файла cnt4_tb.vhd. Разгледайте дадения модел и се уверете, че разбирате смисъла на VHDL конструкциите в него.

Фигура 1 -- Поведенчески модел на брояч.


library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity CNT4B is
   port (UD, CIN, RESET, CLOCK: in STD_LOGIC;
         Q: out UNSIGNED(3 downto 0);
         COUT:out STD_LOGIC);
end CNT4B;

architecture BEHAVIOR of CNT4B is
begin
   process (CLOCK, RESET) 
   	variable CNT : UNSIGNED(3 downto 0);   
   begin
	if RESET='0' then 
		CNT := "0000";
		Q <= CNT;
	else
		if (CLOCK='1'and CLOCK'event)then
 			if cin='1' then
				if ud='1' then
					CNT := CNT+1;
					if CNT="1111" then
						cout<='1';
     					else
						cout<='0';
     					end if;
				elsif ud='0' then
					CNT := CNT-1;
					if CNT="0000" then
						cout<='1';
     					else
						cout<='0';
     					end if;
				else
					CNT := (others => 'X');
				end if;
    			end if;
     			Q <= CNT;
     		end if;
      	end if;     
    end process;
end behavior;

Забележка: Поетапната разработка на модела от Фигура 1 може да се види тук.

 

Задача 2 -- Брояч, BCD, реверсивен, асинхронен reset (оператор if-then-else)

Да се разработи поведенчески VHDL модел на двоично-десетичен (BCD) брояч. 

Указание

Използвайте за основа модела от Задача 1.

 

Задача 3 -- Декодер 3 x 8 (оператор case)

Да се разработи поведенчески VHDL модел на 3 x 8 декодер. Описанието на изводите е дадено в Таблица 2.

Таблица 2.
Сигнал Тип Посока Функция
ain std_logic_vector (2 downto 0) вход входно състояние
enable std_logic вход разрешение; 1 - на yout излиза декодираното състояние, 0 - на yout има нули
yout std_logic_vector (7 downto 0) изход декодирано състояние

На фигура 2 е даден модела на декодера (dec3x8.vhd). Разгледайте дадения модел и се уверете, че разбирате смисъла на VHDL конструкциите в него. Проектирайте тестова установка и проверете корекността на модела посредством симулация. 

Фигура 2 -- Поведенчески модел на декодер.


library ieee;
use ieee.std_logic_1164.all;

entity dec3x8 is 
   port ( ain: in std_logic_vector (2 downto 0);
      enable : in std_logic;
      yout: out std_logic_vector (7 downto 0));
end dec3x8;

architecture behavioral of dec3x8 is

constant sdef      : std_logic_vector(7 downto 0) := "00000000";
constant s0        : std_logic_vector(7 downto 0) := "00000001";
constant s1        : std_logic_vector(7 downto 0) := "00000010";
constant s2        : std_logic_vector(7 downto 0) := "00000100";
constant s3        : std_logic_vector(7 downto 0) := "00001000";
constant s4        : std_logic_vector(7 downto 0) := "00010000";
constant s5        : std_logic_vector(7 downto 0) := "00100000";
constant s6        : std_logic_vector(7 downto 0) := "01000000";
constant s7        : std_logic_vector(7 downto 0) := "10000000";

begin

   decoder: process (ain, enable) begin
      if(enable='0') then
         yout <= sdef;
      else
         case ain is
            when "000" => 
               yout <= s0;
            when "001" => 
               yout <= s1;
            when "010" => 
               yout <= s2;
            when "011" => 
               yout <= s3;
            when "100" => 
               yout <= s4;
            when "101" => 
               yout <= s5;
            when "110" => 
               yout <= s6;
            when "111" => 
               yout <= s7;
            when others =>
               null;

         end case;
     end if;
  end process;
  
end behavioral;

 

Задача 4 -- Декодер за управление на седем-сегментен индикатор (оператор case)

Да се разработи поведенчески VHDL модел на декодер за управление на седем-сегментен индикатор. 

Указание

Използвайте за основа модела от Задача 3.